'''PythonApplication1.py
### 鸭子类型（Duck Typing）

鸭子类型是一种动态类型的概念，源自一句俗语：“如果它走起来像鸭子，叫起来像鸭子，那么它很可能就是一只鸭子。”
在编程中，这意味着如果一个对象的行为和属性看起来像是某种类型的对象，
那么我们就可以将其当作那种类型的对象来使用，而不需要显式地检查其类型。

#### 特点
1. **动态类型检查**：在运行时检查对象的行为和属性，而不是在编译时检查类型。
2. **灵活性**：不需要显式地继承某个类或实现某个接口，只要对象具有所需的方法或属性即可。
3. **简洁性**：减少了类型声明和类型检查的代码，使代码更加简洁和易读。

#### 示例
假设我们有一个函数 `call_quack`，它接受一个对象并调用其 `quack` 方法：

```python
def call_quack(obj):
    obj.quack()

class Duck:
    def quack(self):
        print("Quack!")

class Person:
    def quack(self):
        print("Person is imitating a duck")

# 创建对象
duck = Duck()
person = Person()

# 调用函数
call_quack(duck)  # 输出: Quack!
call_quack(person)  # 输出: Person is imitating a duck
```

在这个例子中，`call_quack` 函数并不关心传入的对象是什么类型，
只要该对象有 `quack` 方法即可。这就是鸭子类型的核心思想。

#### 与静态类型语言的对比
在静态类型语言（如 Java 或 C++）中，你需要显式地声明对象的类型，
并且编译器会在编译时进行类型检查。而在 Python 这样的动态类型语言中，
类型检查是在运行时进行的，因此可以更灵活地处理不同类型的对象。

### 总结
鸭子类型是一种动态类型的概念，强调的是对象的行为和属性，而不是其具体的类型。
这种机制使得 Python 代码更加灵活和简洁，
但也要求开发者在设计和使用代码时更加注意对象的行为一致性。
'''


# 定义函数,不关心对象的类型，只要有quack方法
def call_quack(obj):
    obj.quack()

class Duck:
    def quack(self):
        print("Quack!")

class Person:
    def quack(self):
        print("Person is imitating a duck")

# 创建对象
duck = Duck()
person = Person()

# 调用函数
call_quack(duck)  # 输出: Quack!
call_quack(person)  # 输出: Person is imitating a duck